package qiniu.voidcepc.voicepc.demos.web.utils;

import org.springframework.web.multipart.MultipartFile;

import javax.sound.sampled.*;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.UUID;

/**
 * MultipartFile音频文件采样率转换工具类
 * 专门用于处理Web上传的音频文件，提供采样率转换功能
 * 
 * @author AI Assistant
 * @date 2024-09
 */
public class MultipartFileResampler {
    
    /**
     * 将MultipartFile音频文件转换为指定采样率，并返回转换后的字节数组
     * 
     * @param multipartFile 原始音频文件
     * @param targetSampleRate 目标采样率（如8000、16000等）
     * @return 转换后的音频数据字节数组
     * @throws IOException 文件操作异常
     * @throws UnsupportedAudioFileException 不支持的音频格式
     */
    public static byte[] resampleMultipartFile(MultipartFile multipartFile, int targetSampleRate)
            throws IOException, UnsupportedAudioFileException {
        // 创建临时文件
        Path tempInputPath = null;
        Path tempOutputPath = null;
        
        try {
            // 生成唯一的临时文件路径
            String uniqueId = UUID.randomUUID().toString();
            tempInputPath = Files.createTempFile("input_" + uniqueId, ".wav");
            tempOutputPath = Files.createTempFile("output_" + uniqueId, ".wav");
            
            // 保存MultipartFile到临时输入文件
            File tempInputFile = tempInputPath.toFile();
            multipartFile.transferTo(tempInputFile);
            
            // 使用现有的WavReSample类进行采样率转换
            WavReSample.reSampleRate(targetSampleRate, 
                                     tempInputFile.getAbsolutePath(), 
                                     tempOutputPath.toFile().getAbsolutePath());
            
            // 读取转换后的文件内容到字节数组
            return Files.readAllBytes(tempOutputPath);
            
        } finally {
            // 清理临时文件
            cleanupTempFile(tempInputPath);
            cleanupTempFile(tempOutputPath);
        }
    }
    
    /**
     * 将MultipartFile音频文件转换为指定采样率，并返回转换后的InputStream
     * 注意：调用方需要负责关闭返回的InputStream
     * 
     * @param multipartFile 原始音频文件
     * @param targetSampleRate 目标采样率
     * @return 转换后的音频数据输入流
     * @throws IOException 文件操作异常
     * @throws UnsupportedAudioFileException 不支持的音频格式
     */
    public static InputStream resampleMultipartFileToStream(MultipartFile multipartFile, int targetSampleRate)
            throws IOException, UnsupportedAudioFileException {
        // 转换为字节数组后包装成ByteArrayInputStream
        byte[] resampledData = resampleMultipartFile(multipartFile, targetSampleRate);
        return new ByteArrayInputStream(resampledData);
    }
    
    /**
     * 将MultipartFile音频文件转换为指定采样率，并保存到临时文件
     * 注意：调用方需要负责在使用完毕后删除临时文件
     * 
     * @param multipartFile 原始音频文件
     * @param targetSampleRate 目标采样率
     * @return 转换后的临时文件
     * @throws IOException 文件操作异常
     * @throws UnsupportedAudioFileException 不支持的音频格式
     */
    public static File resampleMultipartFileToTempFile(MultipartFile multipartFile, int targetSampleRate)
            throws IOException, UnsupportedAudioFileException {
        // 创建临时文件
        Path tempInputPath = null;
        Path tempOutputPath = null;
        
        try {
            // 生成唯一的临时文件路径
            String uniqueId = UUID.randomUUID().toString();
            tempInputPath = Files.createTempFile("input_" + uniqueId, ".wav");
            tempOutputPath = Files.createTempFile("output_" + uniqueId, ".wav");
            
            // 保存MultipartFile到临时输入文件
            File tempInputFile = tempInputPath.toFile();
            multipartFile.transferTo(tempInputFile);
            
            // 使用现有的WavReSample类进行采样率转换
            WavReSample.reSampleRate(targetSampleRate, 
                                     tempInputFile.getAbsolutePath(), 
                                     tempOutputPath.toFile().getAbsolutePath());
            
            // 返回转换后的临时文件（不清理，留给调用方处理）
            return tempOutputPath.toFile();
            
        } finally {
            // 只清理输入临时文件，输出文件留给调用方处理
            cleanupTempFile(tempInputPath);
        }
    }
    
    /**
     * 检测MultipartFile音频文件的当前采样率
     * 
     * @param multipartFile 音频文件
     * @return 当前采样率
     * @throws IOException 文件操作异常
     * @throws UnsupportedAudioFileException 不支持的音频格式
     */
    public static int getSampleRate(MultipartFile multipartFile) 
            throws IOException, UnsupportedAudioFileException {
        // 创建临时文件
        Path tempPath = null;
        
        try {
            // 创建临时文件保存MultipartFile内容
            tempPath = Files.createTempFile("detect_" + UUID.randomUUID(), ".wav");
            multipartFile.transferTo(tempPath.toFile());
            
            // 使用Java Sound API读取音频格式信息
            AudioFileFormat audioFileFormat = AudioSystem.getAudioFileFormat(tempPath.toFile());
            AudioFormat format = audioFileFormat.getFormat();
            return (int) format.getSampleRate();
            
        } finally {
            // 清理临时文件
            cleanupTempFile(tempPath);
        }
    }
    
    /**
     * 安全删除临时文件，避免资源泄露
     * 
     * @param path 临时文件路径
     */
    private static void cleanupTempFile(Path path) {
        if (path != null) {
            try {
                Files.deleteIfExists(path);
            } catch (IOException e) {
                // 记录删除失败的日志，但不抛出异常，避免影响主流程
                System.err.println("Failed to delete temporary file: " + path + ", error: " + e.getMessage());
            }
        }
    }
}